package com.jzl.leetcode.everyday.everyday4;

/**
 * 三维形体的表面积
 * <p>
 * 在 N * N 的网格上，我们放置一些 1 * 1 * 1  的立方体。
 * <p>
 * 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
 * <p>
 * 请你返回最终形体的表面积。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：[[2]]
 * 输出：10
 * 示例 2：
 * <p>
 * 输入：[[1,2],[3,4]]
 * 输出：34
 * 示例 3：
 * <p>
 * 输入：[[1,0],[0,2]]
 * 输出：16
 * 示例 4：
 * <p>
 * 输入：[[1,1,1],[1,0,1],[1,1,1]]
 * 输出：32
 * 示例 5：
 * <p>
 * 输入：[[2,2,2],[2,1,2],[2,2,2]]
 * 输出：46
 *  
 * <p>
 * 提示：
 * <p>
 * 1 <= N <= 50
 * 0 <= grid[i][j] <= 50
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/surface-area-of-3d-shapes
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class SurfaceArea {
    public static void main(String[] args) {
        SurfaceArea surfaceArea = new SurfaceArea();
        int[][] a = {{1, 0}, {0, 2}};
        surfaceArea.surfaceArea(a);

    }

    // 题目比较难懂。。。我看了半天才看懂每个数字代表叠放的砖头个数，然后一个子数组内的是按横向摆放的，相邻子数组的紧挨着排列
    // 实现方法
    public int surfaceArea(int[][] grid) {
        // 自己这一列的方块数量
        int selfCount = 0;
        int leftCount = 0;
        int rightCount = 0;
        int beforeCount = 0;
        int afterCount = 0;

        int area = 0;

        // 上下的面积肯定不会冲突，然后码的时候会将两列中紧贴的两面消除掉。
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                selfCount = grid[i][j];

                if (i == 0) {
                    leftCount = 0;
                } else leftCount = Math.min(grid[i - 1][j], selfCount);

                if (i == grid.length - 1) {
                    rightCount = 0;
                } else rightCount = Math.min(grid[i + 1][j], selfCount);

                if (j == 0) {
                    beforeCount = 0;
                } else beforeCount = Math.min(grid[i][j - 1], selfCount);


                if (j == grid[i].length - 1) {
                    afterCount = 0;
                } else afterCount = Math.min(grid[i][j + 1], selfCount);


                area += 4 * selfCount + 2 - leftCount - rightCount - beforeCount - afterCount;
                if (selfCount == 0) {
                    area -= 2;
                }
            }
        }
        return area;
    }
}
